/*
 * Copyright (c) 2022  by Junzhao
 * THIS FILE IS PART OF JAVASE Song Huongkang PROJECT
 * All Rights Reserved.
 */

package Collection接口;

import org.junit.Test;

import java.util.*;

/**
 * @description Collection接口
 * Collection 接口是 List、Set 和 Queue 接口的父接口，该接口里定义的方法
 *      既可用于操作 Set 集合，也可用于操作 List 和 Queue 集合。
 * JDK不提供此接口的任何直接实现，而是提供更具体的子接口(如：Set和List)
 *      实现。
 * 在 Java5 之前，Java 集合会丢失容器中所有对象的数据类型，把所有对象都
 *      当成 Object 类型处理；从 JDK 5.0 增加了泛型以后，Java 集合可以记住容
 *      器中对象的数据类型。
 *
 * @author 俊昭
 * @date 2022/4/18
*/
public class CollectionTest {

    @Test
    public void Ctest01(){
        Collection c1 = new ArrayList();

        // add(Object o) 添加一个元素o在集合尾部
        c1.add("aa");
        c1.add(12);// 实际上进行了自动装箱
        c1.add("bb");
        c1.add(new Date());

        // int size() 元素的个数
        System.out.println(c1.size());// 4

        // void addAll(Collection c) 将一个集合c中的元素全部加入另一个集合
        Collection c2 = new ArrayList();
        c2.add(1);
        c2.addAll(c1);
        System.out.println(c2.size());// 5

        // 隐式调用toString()
        System.out.println(c1);// [aa, 12, bb, Mon Apr 18 17:24:52 CST 2022]
        System.out.println(c2);// [1, aa, 12, bb, Mon Apr 18 17:24:52 CST 2022]


        // void clear() 清空集合元素
        c2.clear();

        // boolean isEmpty 判断是否为空(有没有元素)
        Collection c3 = new ArrayList();
        System.out.println(c1.isEmpty());// false
        System.out.println(c2.isEmpty());// true
        System.out.println(c3.isEmpty());// true


    }
    @Test
    public void Ctest02(){
        Collection c1 = new ArrayList();
        c1.add("aa");
        c1.add("12");
        c1.add("bb");
        c1.add("bb");
        c1.add(new String("123"));

        // boolean contains(Object o) 集合中是否包含元素o
        System.out.println(c1.contains("aa"));// true
        System.out.println(c1.contains("qwer"));// false
        System.out.println(c1.contains(new String("123")));// true
        // 原理是 o对象调用自己的equals()方法去与集合中的元素依顺序相比较(ArrayList)

        // boolean containsAll(Collection col) col中的所有元素否都在当前集合中
        // 不考虑顺序只要全在就
        Collection c2 = Arrays.asList("aa","bb");// 与下面的等价

//        Collection c2 = new ArrayList();
//        c1.add("aa");
//        c1.add("bb");
        System.out.println(c1.containsAll(c2));// true

        // boolean remove(Object obj) 从集合中移除一个元素o
        System.out.println(c1);// [aa, 12, bb, bb, 123]
        System.out.println(c1.remove("bb"));// true 移除成功
        System.out.println(c1.remove("qwerty"));// false 移除失败（也就是没有这个元素）
        System.out.println(c1);// [aa, 12, bb, 123]

        // boolean removeAll(Collection col) 从当前集合中移除与cal共有的元素 有重复就全移除
        // 只要原集合被更改 就返回true
        System.out.println(c1.removeAll(Arrays.asList(new String("123"), "aa", "bb")));// true
        System.out.println(c1);// [12]


    }
    @Test
    public void Ctest03(){
        Collection c1 = new ArrayList();
        c1.add("123");
        c1.add(456);
        c1.add(new int[]{1,2});
        c1.add(new Person("张三",20));
        System.out.println(c1);// [123, 456, [I@3d82c5f3, Person{name='张三', age=20}]

        // boolean retainAll(Collection col) 从该集合中删除col集合中不包含的所有元素
        // 只要原集合被更改 就返回true
        Collection c2 = Arrays.asList("123", new Person("张三",20));//
        System.out.println(c1.retainAll(c2));// true
        System.out.println(c1);// [123, Person{name='张三', age=20}]

        // boolean equals(Object o) 当且仅当集合与o相同时返回true
        // true时 o一定是集合
        // 一定注意列表内元素的equals方法 (由于ArrayList有序所以需要顺序相同)
        Collection c3 = new ArrayList();
        c3.add(new Person("李四",18));
        System.out.println(c3.equals(Arrays.asList(new Person("李四", 18))));// true
        Collection c4 = new ArrayList();
        c4.add("123");
        System.out.println(c4.equals(Arrays.asList("123")));// true

    }
    @Test
    public void Ctest04(){
        Collection c1 = new ArrayList();
        c1.add("123");
        c1.add(456);
        c1.add(new int[]{1,2});
        c1.add(new Person("张三",20));

        // int hashCode() 返回此集合的哈希值
        System.out.println(c1.hashCode());// -194707485 此值与集合内元素有关

        // Object[] toArray() 集合 ---> 数组
        Object[] objects = c1.toArray();
        for (Object object : objects) {
            System.out.println(object);
        }
        // 123 456 [I@3d82c5f3 Person{name='张三', age=20}

        // 数组转为集合
        List<String> list = Arrays.asList(new String[]{"aa","bb","qwe"});
        System.out.println(list);// [aa, bb, qwe]

        Collection objects1 = Arrays.asList("123", 123, new int[]{1, 2}, new Person("张三", 20));
        System.out.println(objects1.size());// [123, 123, [I@61e717c2, Person{name='张三', age=20}]

        //




    }
    @Test
    public void asListTest(){
        Collection objects2 = Arrays.asList(new Integer[]{1, 2}, new Person("张三", 20));
        System.out.println(objects2.toString());// [[Ljava.lang.Integer;@3d82c5f3, Person{name='张三', age=20}]

        Collection objects3 = Arrays.asList(new Integer[]{1, 2});
        System.out.println(objects3);// [1, 2]
    }



}
